home *** CD-ROM | disk | FTP | other *** search
/ US Department of Defense…ndamentals 1.0 2004 April / US Department of Defense: Firewall & Router Fundamentals 1.0 2004 April.iso / text_only / includes / lib / Hashtable.js next >
Encoding:
JavaScript  |  2003-12-08  |  4.4 KB  |  201 lines

  1. /**
  2.   Requires
  3.     List.js
  4.     Iterator.js
  5.  
  6.   Common use:
  7.  
  8.   var hashtable = new_hashtable();
  9.   hashtable_put(hashtable, "command", "getit");
  10.   hashtable_put(hashtable, "session", "2");
  11.  
  12.   for (var iterator=hashtable_keys(hashtable); iterator_has_next(iterator); )
  13.   {
  14.     var key = iterator_next(iterator);
  15.     alert(key + "=" + hashtable_get(hashtable, key));
  16.   }
  17.  
  18.   */
  19.  
  20. var DATA_TYPE = 0;
  21. var HASHTABLE_KEYS = 1;
  22. var HASHTABLE_VALUES = 2;
  23.  
  24. function new_hashtable()
  25. {
  26.   var hashtable = new Array();
  27.   var keys = new_list();
  28.   var values = new_list();
  29.  
  30.   hashtable[DATA_TYPE] = "hashtable";
  31.   hashtable[HASHTABLE_KEYS] = keys;
  32.   hashtable[HASHTABLE_VALUES] = values;
  33.  
  34.   return hashtable;
  35. }
  36.  
  37. function hashtable_put(hashtable, key, value)
  38. {
  39.   if (hashtable_assert(hashtable, "hashtable_put"))
  40.   {
  41.     for (var i=list_iterator(hashtable[HASHTABLE_KEYS]); iterator_has_next(iterator); )
  42.     {
  43.       if (iterator_next(iterator) == key)
  44.       {
  45.         var old_value =  list_get(hashtable[HASHTABLE_VALUES], iterator_previous_index(iterator));
  46.         list_set(hashtable[HASHTABLE_VALUES], iterator_previous_index(iterator), value);
  47.         return old_value;
  48.       }
  49.     }
  50.     list_add(hashtable[HASHTABLE_KEYS], key);
  51.     list_add(hashtable[HASHTABLE_VALUES], value);
  52.     return null;
  53.   }
  54. }
  55.  
  56. function hashtable_get(hashtable, key)
  57. {
  58.   if (hashtable_assert(hashtable, "hashtable_get"))
  59.   {
  60.     for (var i=list_iterator(hashtable[HASHTABLE_KEYS]); iterator_has_next(iterator); )
  61.     {
  62.       if (iterator_next(iterator) == key)
  63.       {
  64.         return list_get(hashtable[HASHTABLE_VALUES], iterator_previous_index(iterator));
  65.       }
  66.     }
  67.     return null;
  68.   }
  69.   else
  70.   {
  71.     return null;
  72.   }
  73. }
  74.  
  75. function hashtable_keys(hashtable)
  76. {
  77.   if (hashtable_assert(hashtable, "hashtable_keys"))
  78.   {
  79.     return list_iterator(hashtable[HASHTABLE_KEYS]);
  80.   }
  81.   else
  82.   {
  83.     return null;
  84.   }
  85. }
  86.  
  87. function hashtable_values(hashtable)
  88. {
  89.   if (hashtable_assert(hashtable, "hashtable_values"))
  90.   {
  91.     iterator = createIterator();
  92.     iterator_add_array(iterator, hashtable[HASHTABLE_VALUES]);
  93.     return iterator;
  94.   }
  95.   else
  96.   {
  97.     return null;
  98.   }
  99. }
  100.  
  101. function hashtable_size(hashtable)
  102. {
  103.   if (hashtable_assert(hashtable, "hashtable_size"))
  104.   {
  105.     return listSize(hashtable[HASHTABLE_KEYS]);
  106.   }
  107.   else
  108.   {
  109.     return -1;
  110.   }
  111. }
  112.  
  113. function hashtable_clone(hashtable)
  114. {
  115.   var clone = new_hashtable();
  116.   for (var i=hashtable_keys(hashtable); iterator_has_next(i); ){
  117.     var key = iterator_next(i);
  118.     var value = hashtable_get(hashtable, key);
  119.     hashtable_put(clone, key, value);
  120.   }
  121.   return clone;
  122. }
  123.  
  124. function hashtable_assert(hashtable, functionName)
  125. {
  126.   var bad = false;
  127.   if (hashtable == null)
  128.   {
  129.     bad = true;
  130.   }
  131.   else
  132.   {
  133.     if (!hashtable.length)
  134.     {
  135.       bad = true;
  136.     }
  137.     else
  138.     {
  139.       if (hashtable.length != 3)
  140.         bad = true;
  141.     }
  142.   }
  143.   if (bad)
  144.   {
  145.     alert("You did not pass an Hashtable to " + functionName + "..causing error to stop js");
  146.  
  147.     var tmp = null;
  148.     alert(tmp.length); // cause an error
  149.   }
  150.  
  151.   return !bad;
  152. }
  153.  
  154. function hashtable_encode(hashtable)
  155. {
  156.   if (hashtable_assert(hashtable, "hashtable_encode"))
  157.   {
  158.     var encoded_hashtable = "";
  159.     for (var i=hashtable_keys(hashtable); iterator_has_next(i); ) {
  160.       var key = iterator_next(i);
  161.       var value = hashtable_get(hashtable, key);
  162.       encoded_hashtable += query_encode(key) + "=" + query_encode(value) + "&";
  163.     }
  164.     return encoded_hashtable;
  165.   }
  166. }
  167.  
  168. function hashtable_decode(hashtable_string)
  169. {
  170.   var hashtable = new_hashtable();
  171.   var delimiter = "&";
  172.   var seperator = "=";
  173.  
  174.   var start_pos = 0;
  175.   for (var pos=hashtable_string.indexOf(delimiter); pos!=-1; pos=hashtable_string.indexOf(delimiter, pos+delimiter.length))
  176.   {
  177.     var name_value = hashtable_string.substring(start_pos, pos);
  178.     var seperator_pos = name_value.indexOf(seperator);
  179.     var key = query_decode(name_value.substring(0, seperator_pos));
  180.     var value = query_decode(name_value.substring(seperator_pos+1));
  181.     hashtable_put(hashtable, key, value);
  182.  
  183.     start_pos = pos+delimiter.length;
  184.   }
  185.   return hashtable;
  186. }
  187.  
  188. function is_hashtable(obj)
  189. {
  190.   if (obj != null) {
  191.     if (typeof(obj) == "object")
  192.     {
  193.       if (obj[DATA_TYPE] == "hashtable") {
  194.         return true;
  195.       }
  196.     }
  197.   }
  198.   return false;
  199. }
  200.  
  201.